package com.bnz.proxy.dynamic;
import com.bnz.dao.impl.UserDaoImpl;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理对象（CGLIB实现的动态代理）提高目标对象的能力
 */
public class UserDaoCGLIBDynamicImpl implements MethodInterceptor {
    // 1. 创建代理对象（CGLIB实现的动态代理）
    public UserDaoImpl createProxy(){
        // 1.1 创建Enhancer对象
        Enhancer enhancer = new Enhancer();
        // 1.2 设置Enhancer对象的父类
        enhancer.setSuperclass(UserDaoImpl.class);
        // 1.3 设置实现了MethodInterceptor接口的对象
        enhancer.setCallback(this);
        // 1.4 返回代理对象
        return (UserDaoImpl) enhancer.create();
    }

    // 2. 调用目标对象的方法
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        // 2.1 如果调用add方法就调用自定义测试方法测试CGLIB实现的动态代理
        if (method.getName().equals("add")){
            cs();
        }
        return methodProxy.invokeSuper(proxy,args);
    }

    // 自己定义方法测试CGLIB实现的动态代理
    private void cs(){
        System.out.println("CGLIB实现的动态代理");
    }
}
